perm filename PUZZ.SAI[226,JMC] blob
sn#005390 filedate 1972-05-30 generic text, type T, neo UTF8
00100 BEGIN "PUZZLE"
00200 REQUIRE 50000 SYSTEM_PDL;
00300 INTEGER ARRAY S[1:43,1:43],G[1:43,1:43],MM[1:43,1:43],
00400 SM[1:43,1:43],MG[1:43,1:43],SG[1:43,1:43];
00500 INTEGER M,N;
00600 PRELOAD_WITH 4,2,1,2,3,1,5,2,3,3,2,2,3,5,3,2,3,2,3,2,2,3,5,1,2,
00700 3,5,1,3,2,1,3,2,3,3,2,3,1,5,3,2,1,2;
00800 INTEGER ARRAY Q[1:43];
00900
01000 FORWARD RECURSIVE INTEGER PROCEDURE CSENT1(INTEGER M,N,P);
01100 FORWARD RECURSIVE INTEGER PROCEDURE CSENTMOAN(INTEGER M,N);
01200 FORWARD RECURSIVE INTEGER PROCEDURE CSENTMOAN1(INTEGER M,N,P);
01300 FORWARD RECURSIVE INTEGER PROCEDURE CMOAN(INTEGER M,N);
01400 FORWARD RECURSIVE INTEGER PROCEDURE CMOAN1(INTEGER M,N,P);
01500 FORWARD RECURSIVE INTEGER PROCEDURE CMOANGROAN(INTEGER M,N);
01600 FORWARD RECURSIVE INTEGER PROCEDURE CMOANGROAN1(INTEGER M,N,P);
01700 FORWARD RECURSIVE INTEGER PROCEDURE CGROAN1(INTEGER M,N,P);
01800 FORWARD RECURSIVE INTEGER PROCEDURE CGROAN(INTEGER M,N);
01900 FORWARD RECURSIVE INTEGER PROCEDURE CSENTGROAN(INTEGER M,N);
02000 FORWARD RECURSIVE INTEGER PROCEDURE CSENTGROAN1(INTEGER M,N,P);
02100
02200 RECURSIVE INTEGER PROCEDURE CSENT(INTEGER M,N);
02300 BEGIN
02400 RETURN(IF M>N THEN 1 ELSE IF S[M,N]=-1 THEN (S[M,N]←CSENT1(M,N,M)) ELSE S[M,N]) END;
02500
02600 RECURSIVE INTEGER PROCEDURE CSENT1(INTEGER M,N,P);
02700 BEGIN
02800 RETURN(IF P>N THEN (IF M>N THEN 1 ELSE 0)
02900 ELSE IF Q[P]= 1 THEN CMOAN(M,P-1)*CGROAN(P+1,N)+CSENT1(M,N,P+1)
03000 ELSE IF Q[P]= 5 THEN CGROAN(M,P-1)*CSENTMOAN(P+1,N)+CSENT1(M,N,P+1)
03100 ELSE CSENT1(M,N,P+1)) END;
03200
03300 RECURSIVE INTEGER PROCEDURE CSENTMOAN(INTEGER M,N);
03400 BEGIN
03500 RETURN(IF M>N THEN 1 ELSE IF SM[M,N]=-1 THEN
03600 (SM[M,N] ← CSENTMOAN1(M,N,M)) ELSE SM[M,N]) END;
03700
03800 RECURSIVE INTEGER PROCEDURE CSENTMOAN1(INTEGER M,N,P);
03900 BEGIN
04000 RETURN(IF P>N THEN CMOAN(M,N)
04100 ELSE CSENT(M,P-1)*CMOAN(P,N)+CSENTMOAN1(M,N,P+1)) END;
04200
04300 RECURSIVE INTEGER PROCEDURE CMOAN(INTEGER M,N);
04400 BEGIN
04500 RETURN(IF M>N THEN 1 ELSE IF MM[M,N]=-1 THEN
04600 (MM[M,N] ← CMOAN1(M,N,M)) ELSE MM[M,N]) END;
04700
04800 RECURSIVE INTEGER PROCEDURE CMOAN1(INTEGER M,N,P);
04900 BEGIN
05000 RETURN(IF P>N THEN (IF M>N THEN 1 ELSE 0)
05100 ELSE IF Q[P]=2 THEN CSENT(M,P-1)*CSENT(P+1,N)+CMOAN1(M,N,P+1)
05200 ELSE IF Q[P]=3 THEN CGROAN(M,P-1)*CMOANGROAN(P+1,N)+CMOAN1(M,N,P+1)
05300 ELSE CMOAN1(M,N,P+1)) END;
05400
05500 RECURSIVE INTEGER PROCEDURE CMOANGROAN(INTEGER M,N);
05600 BEGIN
05700 RETURN(IF M>N THEN 1 ELSE IF MG[M,N]=-1 THEN
05800 (MG[M,N]←CMOANGROAN1(M,N,M)) ELSE MG[M,N]) END;
05900
06000 RECURSIVE INTEGER PROCEDURE CMOANGROAN1(INTEGER M,N,P);
06100 BEGIN
06200 RETURN(IF P>N THEN 1 ELSE CMOAN(M,P-1)*CGROAN(P,N)+CMOANGROAN1(M,N,P+1))
06300 END;
06400
06500 RECURSIVE INTEGER PROCEDURE CGROAN(INTEGER M,N);
06600 BEGIN
06700 RETURN(IF M>N THEN 1 ELSE IF G[M,N]=-1 THEN
06800 (G[M,N] ← CGROAN1(M,N,M)) ELSE G[M,N]) END;
06900
07000 RECURSIVE INTEGER PROCEDURE CGROAN1(INTEGER M,N,P);
07100 BEGIN
07200 RETURN(IF P>N THEN (IF M>N THEN 1 ELSE 0)
07300 ELSE IF Q[P]=3 THEN CMOAN(M,P-1)*CGROAN(P,N)+CGROAN1(M,N,P+1)
07400 ELSE IF Q[P]=4 THEN CGROAN(M,P-1)*CSENTGROAN(P,N)
07500 +CGROAN1(M,N,P+1)
07600 ELSE CGROAN1(M,N,P+1)) END;
07700
07800 RECURSIVE INTEGER PROCEDURE CSENTGROAN(INTEGER M,N);
07900 BEGIN
08000 RETURN(IF M>N THEN 1 ELSE IF SG[M,N]=-1 THEN
08100 (SG[M,N] ← CSENTGROAN1(M,N,M)) ELSE SG[M,N]) END;
08200
08300 RECURSIVE INTEGER PROCEDURE CSENTGROAN1(INTEGER M,N,P);
08400 BEGIN
08500 RETURN(IF P>N THEN 1 ELSE CSENT(M,P-1)*CGROAN(P,N)+
08600 CSENTGROAN1(M,N,P+1)) END;
08700
08800 FOR M←1 STEP 1 UNTIL 43 DO
08900 FOR N←1 STEP 1 UNTIL 43 DO
09000 BEGIN S[M,N]←MM[M,N]←G[M,N]←SM[M,N]←MG[M,N]←SG[M,N]←-1 END;
09100
09200 OUTSTR(CVS(CSENT(1,43)))
09300 END;